home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
SERIE_AI
/
AI_081
/
CBHD501
/
DOC
/
SCSIDRV2.U
< prev
Wrap
Text File
|
1998-03-14
|
14KB
|
422 lines
Konzept für Systemglobale SCSI-Routinen. © S. Engel 1994-1995
Teil 2 : Target-Handling
#
# $Source: F:\KLEISTER.II\CBHD\RCS\scsidrv2.doc,v $
#
# $Revision: 1.1 $
#
# $Author: S_Engel $
#
# $Date: 1995/02/05 10:40:36 $
#
# $State: Exp $
#
#****************************************************************************
# History:
#
# $Log: scsidrv2.doc,v $
# Revision 1.1 1995/02/05 10:40:36 S_Engel
# Initial revision
#
#
#
#
STRUKTUREN
Typen für Target-Routinen:
tReqData =
RECORD
ErrCode : BYTE; (* Standard auf $70 *)
SegNo : BYTE;
SenseKey : BYTE;
InfoByte1 : BYTE; (* ODD ADDRESS!!! *)
InfoByte2 : BYTE;
InfoByte3 : BYTE;
InfoByte4 : BYTE;
AddLen : BYTE; (* Standard auf $0A : 18 Bytes Daten *)
Reserved : LONGCARD;
CmdSpec : LONGCARD; (* Cmd-Specific Info *)
AddSense : BYTE;
AddSenseQual: BYTE;
FieldRepl : BYTE;
SKeySpec0 : BYTE;
SKeySpec1 : BYTE;
SKeySpec2 : BYTE;
END;
tpCmd = POINTER TO ARRAY[0..11] OF BYTE;
tpTargetHandler = POINTER TO tTargetHandler;
tTargetHandler =
RECORD
next : tpTargetHandler;
TSel : PROCEDURE ((* CSB *) SHORTCARD,
(* CSD *) SHORTCARD) : BOOLEAN;
TCmd : PROCEDURE ((* Cmd *) tpCmd) : BOOLEAN;
TCmdLen : PROCEDURE ((* Cmd *) SHORTCARD) : SHORTCARD;
*****
Bei den drei Routinen könnte ich mich auf Registerübergabe einlassen, damit
man etwas schneller ist, aber da hat man dann ja sofort die Basis für
Nicht-Reentranz.
tSel muß für andere Busse als NCR5380 evtl anders gelöst werden, eigentlich
sollten aktueller Bus-Status und aktueller Busdateninhalt aber reichen,
höchstens den Busdateninhalt auf 32 Bit anheben (32-Bit-SCSI)
*****
TReset : PROCEDURE;
TEOP : PROCEDURE;
TPErr : PROCEDURE;
TPMism : PROCEDURE;
TBLoss : PROCEDURE;
TUnknownInt : PROCEDURE;
END;
FUNKTIONEN
Jede Routine in tTargetHandler kann einen Nullzeiger enthalten, was bedeutet,
daß der Handler sich für die Funktion nicht interessiert.
Per Install wird ein Handler eingetragen.
Die Installationsroutine verkettet den Handler über next und merkt
sich den ersten Eintrag der Tabelle.
Wenn noch keine Handler installiert sind, werden die Interrupts
geschärft.
Grundsätzlich werden später installierte Handler eher gerufen, also
kann ein später installierender Handler die Kommandos einem vorher
installierten Handler wegschnappen.
Bei Deinstall wird ein Handler ausgekettet. Ist kein Handler
mehr übrig, werden die Interrupts entschärft.
NICHT VERGESSEN!!
Alle Routinen laufen im Interrupt ab -> keine Systemaufrufe!!!
TT : Interrupt vom TT-MFP
Falcon : Interrupt vom ST-MFP
Bei der ganzen Sache gibt es ein Problem:
Festplattentreiber löschen im allgemeinen das select enable register
bei SCSI-Zugriffen, und somit ist daraufhin der Handler für Kommandos
inaktiv.
Bekannte Verhalten von Plattentreibern:
CBHD : löscht (in bisherigen Releases von Claus Brod)
AHDI : löscht
HUSHI : löscht
HDDRIVER : löscht anscheinend nicht
next : Nächster Handler in der Tabelle
Wird vom Treiber benutzt (Finger wech)
TSel : Selektion aufgetreten
Interessant zB für reselection
CSD ist der aktuelle Inhalt des SCSI-Busses, maskiert mit der
eigenen ID -> das Bit der ID des Rufers ist gesetzt.
Damit kann kontrolliert werden, ob es überhaupt das Gerät ist,
auf das gewartet wird.
CSB ist der aktuelle SCSI-Busstatus:
Bit 15 Reserved (EDMA)
Bit 14 Reserved (DRQ)
Bit 13 Reserved (SPER)
Bit 12 Reserved (INT)
Bit 11 Reserved (PHSM)
Bit 10 Reserved (BSY)
Bit 09 /ATN
Bit 08 /ACK
Bit 07 /RST
Bit 06 /BSY
Bit 05 /REQ
Bit 04 /MSG
Bit 03 /C/D
Bit 02 /I/O
Bit 01 /SEL
Bit 00 /DBP
Man sollte dabei beachten, daß eine Übernahme der Selektion
allen anderen in der Handlerkette liegenden Handlern
keine Chance läßt, an der aktuellen Operation teilzunehmen.
Wer auf eine Reselection wartet, sollte nur diese annehmen
(Reselection: /I/O gesetzt)
!!!! Nur was macht man, wenn zwei Prozesse auf eine Reselection
!!!! vom gleichen Gerät warten??
RETURN TRUE : Zustand angenommen und behandelt
RETURN FALSE : interessiert mich nicht
TCmd : Bekommt ein empfangenes Kommando angeboten
RETURN FALSE : Nicht an dem Kommando interessiert
RETURN TRUE : Kommando verarbeitet
Wenn die Routine das Kommando verarbeitet, muß sie selbst
SendData, GetData, SendStatus und SendMsg abarbeiten
und dann auch TRUE melden.
TCmdLen: Ein Kommando ist angekommen, dessen Kommandolänge nicht
bekannt ist.
RETURN : 0 : Dieses Kommando interessiert den Handler nicht
x : Dieses Kommando soll mit x Bytes empfangen
werden.
Vom Kern werden selbsttätig berücksichtigt:
Gruppe 0 : 6-Byte-Kommando
Gruppe 1 : 10-Byte-Kommando
Gruppe 2 : 10-Byte-Kommando
Gruppe 5 : 12-Byte-Kommando
bei allen anderen Gruppen wird nachgefragt (z. Zt. nicht)
Gibt niemand eine Antwort, wird folgende Annahme getroffen:
Gruppe 3 : 10-Byte-Kommando Gruppe ist Reserved!
Gruppe 4 : 10-Byte-Kommando Gruppe ist Reserved!
Gruppe 6 : 12-Byte-Kommando Gruppe ist vendor specific
Gruppe 7 : 12-Byte-Kommando Gruppe ist vendor specific
ACHTUNG!!!
Wer die Kommandolänge angibt, MUSS auch das Kommando benutzen
und dann TCmd bedienen!
In dem Fall, daß TCmdLen gerufen wird, während der aktive
Handler in TSel ist, ist eh klar, daß er das Kommando
bedient.
Wenn TCmdLen vom internen Kommandoempfänger gerufen wird,
wird anschließend das Kommando auch an diesen Handler per
TCmd übergeben! (z. Zt. nicht implementiert)
TReset: Der SCSI-Bus hatte einen Reset
Alle installierten Handler werden gerufen
TEOP : EOP aufgetreten (zur Zeit nicht benutzt)
TPErr : Ein Parity Error ist aufgetreten (z. Zt. nicht benutzt)
TPMism: Ein Phase Mismatch aufgetreten (z. Zt. nicht benutzt)
Routine kann auch NIL sein
TBLoss: BSY verloren (z. Zt. nicht benutzt)
TUnknownInt: unbekannter Interrupt aufgetreten (z. Zt. nicht benutzt)
ABLAUF DER INTERRUPT-BEHANDLUNG (ZUR ZEIT)
------------------------
| |
| Interrupt vom |
| MFP |
| |
------------------------
|
|
V
------------------------
| |
| Selektion? | Nein
| |--------->
| |
| |
------------------------
|
| Ja
V
------------------------
| |
| Interrupt-Handler |
----->| über TSel rufen |
| | | Ja
| | RETURN TRUE? |---------> Ende
| | |
| ------------------------
| |
| Ja | Nein
| V
| ------------------------
| | |
------| weitere Handler in |
| der Kette? |
| |
------------------------
|
| Nein
V
------------------------
| |
| 1. Kommando-Byte |
| empfangen |
| |
------------------------
| ********************************************
| * Noch nicht implementiert *
V * *
------------------------ * ------------------------ *
| | * | | *
| Klasse 0,1,2,5? | * Nein | Handler fragen, | *
| |---*--------->| welche Kommando- | *
| | * | länge das Cmd hat. | *
| | * --->| |------ *
| | * | | Antwort 0? | | *
| | * | | | | *
------------------------ * | ------------------------ | *
| * | | | *
| Ja * | | Ja | *
V * | V | *
------------------------ * | ------------------------ | *
| | * | | | | *
| Rest des Kommandos | * | | weitere Handler in | | *
| empfangen. | * ----| der Kette? | | *
| | * Ja | | | *
| Klasse Bytes | * ------------------------ | *
| 0 6 | * | | *
| 1 10 | * | Nein | *
| 2 10 | * | | *
| 5 12 | * V | *
| | * ------------------------ | *
------------------------ * | | | *
| * | Rest des Kommandos | | *
| * | empfangen. | | *
| * | | | *
| * | 10 Bytes | | *
V * | | | *
------------------------ * ------------------------ | *
| | * | | *
| Interrupt-Handler | * | | *
----->| über TCmd rufen |<--*---------------------- | *
| | | * | *
| | RETURN TRUE? |---*--------->Ende | *
| | | * Ja | *
| ------------------------ * | *
| | * ------------------------ | *
| | * | |<----- *
| Ja | Nein * | Rest des Kommandos | *
| | * | empfangen. | *
| | * | | *
| V * | Kommando über TCmd | *
| ------------------------ * | von dem Handler | *
| | | * | abarbeiten lassen | *
------| weitere Handler in | * | | *
| der Kette? | * ------------------------ *
| | * | *
------------------------ * | *
| * V *
| Nein * Ende *
V * *
------------------------ ********************************************
| |
| REQUEST SENSE? |
| |
| |
------------------------
|
| Nein
V
------------------------
| |
| Setze Sense Data auf |
| ILLEGAL REQUEST und |
| INVALID COMMAND |
| OPERATION CODE |
| |
| Sende Check Condition|
| und Msg Cmdcomplete |
| |
------------------------
|
|
V
Ende
STANDARDFUNKTIONEN
Als Targethandler sollten unbedingt die folgenden Funktionen installiert
werden (mandatory für Processordevices):
TEST UNIT READY (00H)
REQUEST SENSE (03H)
(* liefert die Daten aus ReqData *)
SEND (0AH)
INQUIRY (12H)
SEND DIAGNOSTIC (1DH)
REQUEST SENSE kann dabei den globalen Sense-Block übertragen, in den auch alle
Routinen Ihre Fehler eintragen können (dran denken: wer eigene Fehlermeldungen
in den Sense-Daten zusammenstellt, sollte auch die Sense-Daten vorher
vorlöschen, damit keine Altlasten darin liegen)
DERZEITIGE REALISIERUNG
CBHD bedient die Mandatories und antwortet auf Request Sense mit den globalen
Request Sense Daten.
Inquiry meldet Processor Device, ANSI 2, ATARI, TT030/Falcon030.
Ein SCSI-Monitor zum rumspielen existiert auch.
TODO
-Bedienung von BSY loss
-Bedienung von EOP
-Bedienung von Phase Mismatch
-Bedienung von UnknownInt (landet bei TReset)
-Übergabe eines Kommandos an den Beantworter von TCmdLen, wenn das
Kommando selbsttätig von der Interruptroutine empfangen wurde.
-Wenn man selbst als Initiator auftritt, und die ersten Schritte zum Absetzen
des Kommandos vorbereitet sind, und dann eine Selektion als Target auftritt,
werden die Ports von den Target-Routinen umprogrammiert.
Danach kann man wohl kaum an der unterbrochenen Stelle wieder aufsetzen.
Muß in Ordnung gebracht werden!!
ANWENDUNGEN
Für Anwendungen läßt sich einiges sehen. Zum einen ist ein SCSI-Monitor
möglich, mit dem man sehen kann, was ein zu untersuchendes Programm an
SCSI-Calls absetzt. Ein sehr interessantes Zeil ist auch ein Netzwerktreiber,
der über SCSI arbeitet.
PROBLEME
Während Transfers müssen die Interrupts maskiert werden, da sonst ein
Transfer durch den Handler unterbrochen wird. Es wäre interessant, wenn ein
Treiber auch die Interrupts zum Schlafenlegen benutzt.
Falcon: Zugriffe auf die Floppy führen zum Interrupt, da der SCSI-Interrupt
auf dem DMA-Interrupt liegt. :-(((
Mal sehen, was man da machen kann.
Wenn die Target-Routinen aktiv sind, bekommen Programme mit onboard-SCSI evtl.
Probleme, da die DMA-Transfers über den PhaseMismatch an den Interrupt-Handler
geliefert werden.
OFFENE FRAGEN
-Wann und in welcher Form sollten EOP, Parity Error, Phase Mismatch
und BSY loss überhaupt verwendet werden?
-EOP, Parity Error, PhaseMismatch, BSY loss nur an den in Aktion
befindlichen Handler? Halte ich für Sinnvoll, was sollen die anderen
damit?
Wie kann man diese Interrupts überhaupt bekommen, während man Transfers
macht???
-Was hängt man in TUnknownInt?
1. Interrupt bei BSR.INT = 0
2. ?